// 你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。


// 给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。

//  

// 示例 1：

// 输入：[1,2,3,1]
// 输出：4
// 解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。
//      偷窃到的最高金额 = 1 + 3 = 4 。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/house-robber
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。


/* 思路
设立状态 dp[i][j]
i: 小偷走到哪一家
j: 小偷实际偷到那一家

dp[i][j] = max(
    max(dp[i-1][k] + nums[j]),k=0...j-2;
    dp[i][j-1]
    )

又因为  dp[i] > dp[i-1]
则 dp[i][j] = max(
    dp[i-1][j-2] + nums[j],
    dp[i][j-1]
    )
 */

class Solution 
{
public:
    vector<int> realyRobMaxMoney;
    int getValue(vector<int>& realyRobMaxMoney,int index)
    {
        if(index < 0 || index >= realyRobMaxMoney.size())
            return 0;
        return realyRobMaxMoney[index];
    }
    int rob(vector<int>& nums) {
        if(nums.size()<=0)
            return 0;
        for (int i=0;i<nums.size();i++)
        {
            realyRobMaxMoney.push_back(max(getValue(realyRobMaxMoney,i-2)+nums[i],getValue(realyRobMaxMoney,i-1))) ;
        }
        return realyRobMaxMoney[realyRobMaxMoney.size()-1];
    }
};